/**
 * Copyright © 2024 北京迅安网络系统有限责任公司 Co., Ltd. All rights reserved.
 */

#ifndef FRIPMS_BASE_HEADER_H
#define FRIPMS_BASE_HEADER_H

#ifndef HANDLE
#define HANDLE void*
#endif

#ifndef BOOL
#define BOOL int
#endif

#ifndef UNIT8
#define UNIT8 unsigned char
#endif

#ifndef UNIT16
#define UNIT16 unsigned short
#endif

#ifndef ULONG
#define ULONG unsigned int
#endif

#ifndef BYTE
#define BYTE unsigned char
#endif

typedef char *LPSTR, *PSTR;
typedef const char *LPCSTR, *PCSTR;

typedef HANDLE DEVHANDLE;
typedef HANDLE HAPPLICATION;
typedef HANDLE HCONTAINER;

#ifndef TRUE
#define TRUE 1
#endif

#ifndef FALSE
#define FALSE 0
#endif

#define ACCOUNT_DEFAULT_LENGTH 1024 // 账号类接口BYTE*默认长度

#define TIMA_INTERFACE_DESCRIPTOR "com.tima.ohos.tima.ITimaManager"
// #define DECLARE_INTERFACE_DESCRIPTOR	"com.tima.ohos.tima.ITimaManager"

/**
 * 服务ID
 */
#define TIMA_SERVICE_ID 9999       // 定义服务ID
#define ACCOUNT_SERVICE_ID 10000   // 账号服务ID
#define CREDIBLE_SERVICE_ID 10001  // 可信服务ID
#define PMOS_CORE_SERVICE_ID 10002 // PMS Core服务ID

/**
 * PMS Core接口
 */
#define CMD_GET_GA_SUBSYSTEM_INFO 9

/**
 * 账号类接口
 */
#define CMD_GET_PMS_ACTIVE_STATE 11 // 1.获取系统激活状态
#define CMD_GET_PMS_OSID 12         // 2.获取设备OSID值
#define CMD_GET_PMS_ID 13           // 3.获取当前账户PMSID值
#define CMD_CHECK_PMS_OSID 14       // 4.校验传入的OSID值是否合法有效
#define CMD_CHECK_PMS_ID 15         // 5.校验传入的PMSID值是否合法有效

/**
 * 可信子系统接口
 */
#define CMD_GET_TC_JS 21  // 1.获取终端当前可信裁决状态
#define CMD_GET_TC_REP 22 // 2.获取可信报告数据
#define CMD_GET_TC_AVR 23 // 3.获取三方应用安装/验签记录
#define CMD_GET_TC_AMR 24 // 4.获取三方应用度量（启动使用）记录

#define SGD_SM 0x00020100    // 椭圆曲线密码算法
#define SGD_SM2_1 0x00020200 // 椭圆曲线签名算法
#define SGD_SM2_2 0x00020400 // 椭圆曲线密钥交换协议
#define SGD_SM2_3 0x00020800 // 椭圆曲线加密算法

#define SGD_SM3 0x00000001    // SM3密码杂凑算法
#define SGD_SHA1 0x00000002   // SHA1密码杂凑算法
#define SGD_SHA256 0x00000004 // SHA256密码杂凑算法

#define SGD_MODE_ECB 0x00000001
#define SGD_MODE_CBC 0x00000002
#define SGD_MODE_CFB 0x00000004
#define SGD_MODE_OFB 0x00000008
#define SGD_MODE_MAC 0x00000010

#define SGD_SM4_MASK 0x00000400
#define SGD_SM4_ECB (SGD_SM4_MASK | SGD_MODE_ECB)
#define SGD_SM4_CBC (SGD_SM4_MASK | SGD_MODE_CBC)
#define SGD_SM4_CFB (SGD_SM4_MASK | SGD_MODE_CFB)
#define SGD_SM4_OFB (SGD_SM4_MASK | SGD_MODE_OFB)
#define SGD_SM4_MAC (SGD_SM4_MASK | SGD_MODE_MAC)

// 错误代码标识
// 宏描述	预定义值	说明
#define RET_OK 0x00000000                        // 成功
#define RET_FAIL 0x0A000001                      // 失败
#define RET_UNKNOWNERR 0x0A000002                // 异常错误
#define RET_NOTSUPPORTYETERR 0x0A000003          // 不支持的服务
#define RET_FILEERR 0x0A000004                   // 文件操作错误
#define RET_INVALIDHANDLEERR 0x0A000005          // 无效的句柄
#define RET_INVALIDPARAMERR 0x0A000006           // 无效的参数
#define RET_READFILEERR 0x0A000007               // 读文件错误
#define RET_WRITEFILEERR 0x0A000008              // 写文件错误
#define RET_NAMELENERR 0x0A000009                // 名称长度错误
#define RET_KEYUSAGEERR 0x0A00000A               // 密钥用途错误
#define RET_MODULUSLENERR 0x0A00000B             // 模的长度错误
#define RET_NOTINITIALIZEERR 0x0A00000C          // 未初始化
#define RET_OBJERR 0x0A00000D                    // 对象错误
#define RET_MEMORYERR 0x0A00000E                 // 内存错误
#define RET_TIMEOUTERR 0x0A00000F                // 超时
#define RET_INDATALENERR 0x0A000010              // 输入数据长度错误
#define RET_INDATAERR 0x0A000011                 // 输入数据错误
#define RET_GENRANDERR 0x0A000012                // 生成随机数错误
#define RET_HASHOBJERR 0x0A000013                // HASH对象错
#define RET_HASHERR 0x0A000014                   // HASH运算错误
#define RET_GENRSAKEYERR 0x0A000015              // 产生RSA密钥错
#define RET_RSAMODULUSLENERR 0x0A000016          // RSA密钥模长错误
#define RET_CSPIMPRTPUBKEYERR 0x0A000017         // CSP服务导入公钥错误
#define RET_RSAENCERR 0x0A000018                 // RSA加密错误
#define RET_RSADECERR 0x0A000019                 // RSA解密错误
#define RET_HASHNOTEQUALERR 0x0A00001A           // HASH值不相等
#define RET_KEYNOTFOUNTERR 0x0A00001B            // 密钥未发现
#define RET_CERTNOTFOUNTERR 0x0A00001C           // 证书未发现
#define RET_NOTEXPORTERR 0x0A00001D              // 对象未导出
#define RET_DECRYPTPADERR 0x0A00001E             // 解密时做补丁错误
#define RET_MACLENERR 0x0A00001F                 // MAC长度错误
#define RET_BUFFER_TOO_SMALL 0x0A000020          // 缓冲区不足
#define RET_KEYINFOTYPEERR 0x0A000021            // 密钥类型错误
#define RET_NOT_EVENTERR 0x0A000022              // 无事件错误
#define RET_DEVICE_REMOVED 0x0A000023            // 设备已移除
#define RET_PIN_INCORRECT 0x0A000024             // PIN不正确
#define RET_PIN_LOCKED 0x0A000025                // PIN被锁死
#define RET_PIN_INVALID 0x0A000026               // PIN无效
#define RET_PIN_LEN_RANGE 0x0A000027             // PIN长度错误
#define RET_USER_ALREADY_LOGGED_IN 0x0A000028    // 用户已经登录
#define RET_USER_PIN_NOT_INITIALIZED 0x0A000029  // 没有初始化用户口令
#define RET_USER_TYPE_INVALID 0x0A00002A         // PIN类型错误
#define RET_APPLICATION_NAME_INVALID 0x0A00002B  // 应用名称无效
#define RET_APPLICATION_EXISTS 0x0A00002C        // 应用已经存在
#define RET_USER_NOT_LOGGED_IN 0x0A00002D        // 用户没有登录
#define RET_APPLICATION_NOT_EXISTS 0x0A00002E    // 应用不存在
#define RET_FILE_ALREADY_EXIST 0x0A00002F        // 文件已经存在
#define RET_NO_ROOM 0x0A000030                   // 空间不足
#define RET_FILE_NOT_EXIST 0x0A000031            // 文件不存在
#define RET_REACH_MAX_CONTAINER_COUNT 0x0A000032 // 已达到最大可管理容器数
#define RET_OBJECT_IS_EXIST 0x0A000033           // 对象已经存在

#define DIGEST_SM3_LENGTH 32
#define DIGEST_SHA1_LENGTH 20
#define DIGEST_SHA256_LENGTH 32
#define SM2_MODULUS_BITS_LEN 256

#define ECC_MAX_XCOORDINATE_BITS_LEN 512
#define ECC_MAX_YCOORDINATE_BITS_LEN 512
#define ECC_MAX_MODULUS_BITS_LEN 512
#define MAX_IV_LEN (256 / 8)

typedef struct Struct_Version {
    BYTE major;
    BYTE minor;
} VERSION;

typedef struct Struct_DEVINFO {
    VERSION Version;         // 数据结构版本号，本结构的版本号为1.0
    BYTE Manufacturer[64];   // 设备厂商信息,以 ‘\0’为结束符的ASCII字符串
    BYTE Issuer[64];         // 发行厂商信息,以 ‘\0’为结束符的ASCII字符串
    BYTE Label[32];          // 设备标签, 以 ‘\0’为结束符的ASCII字符串
    BYTE SerialNumber[32];   // 序列号,以 ‘\0’为结束符的ASCII字符串
    VERSION HWVersion;       // 设备硬件版本
    VERSION FirmwareVersion; // 设备本身固件版本
    ULONG AlgSymCap;         // 分组密码算法标识
    ULONG AlgAsymCap;        // 非对称密码算法标识
    ULONG AlgHashCap;        // 密码杂凑算法标识
    ULONG DevAuthAlgId;      // 设备认证使用的分组密码算法标识
    ULONG TotalSpace;        // 设备总空间大小
    ULONG FreeSpace;         // 用户可用空间大小
    ULONG MaxECCBufferSize;  //
    ULONG MaxBufferSize;     //
    BYTE Reserved[64];       // 保留扩展
} DEVINFO, *PDEVINFO;

typedef struct Struct_ECCPUBLICKEYBLOB {
    ULONG BitLen;
    BYTE XCoordinate[ECC_MAX_XCOORDINATE_BITS_LEN / 8];
    BYTE YCoordinate[ECC_MAX_YCOORDINATE_BITS_LEN / 8];
} ECCPUBLICKEYBLOB, *PECCPUBLICKEYBLOB;

typedef struct Struct_ECCPRIVATEKEYBLOB {
    ULONG BitLen;
    BYTE PrivateKey[ECC_MAX_MODULUS_BITS_LEN / 8];
} ECCPRIVATEKEYBLOB, *PECCPRIVATEKEYBLOB;

typedef struct Struct_ECCCIPHERBLOB {
    BYTE XCoordinate[ECC_MAX_XCOORDINATE_BITS_LEN / 8];
    BYTE YCoordinate[ECC_MAX_XCOORDINATE_BITS_LEN / 8];
    BYTE HASH[32];
    ULONG CipherLen;
    BYTE Cipher[1];
} ECCCIPHERBLOB, *PECCCIPHERBLOB;

typedef struct Struct_BLOCKCIPHERPARAM {
    BYTE IV[MAX_IV_LEN];
    ULONG IVLen;
    ULONG PaddingType;
    ULONG FeedBitLen;
} BLOCKCIPHERPARAM, *PBLOCKCIPHERPARAM;

typedef struct Struct_ENVELOPEDKEYBLOB {
    ULONG Version;
    ULONG ulSymmAlgID;
    ULONG ulBits;
    BYTE cbEncryptedPriKey[64];
    ECCPUBLICKEYBLOB PubKey;
    ECCCIPHERBLOB ECCCipherBlob;
} ENVELOPEDKEYBLOB, *PENVELOPEDKEYBLOB;

typedef struct Struct_ECCSIGNATUREBLOB {
    BYTE r[ECC_MAX_XCOORDINATE_BITS_LEN / 8];
    BYTE s[ECC_MAX_XCOORDINATE_BITS_LEN / 8];
} ECCSIGNATUREBLOB, *PECCSIGNATUREBLOB;

#endif